package com.info.zhiduoduo.core.service;

import com.info.zhiduoduo.common.constants.SmartResult;
import com.info.zhiduoduo.core.dto.pingan.BatchTransferQuery;
import com.info.zhiduoduo.repository.dto.account.BatchQueryResultDto;
import com.info.zhiduoduo.repository.dto.crowdsource.*;
import com.info.zhiduoduo.repository.entity.company.Company;
import com.info.zhiduoduo.repository.entity.quota.CrowdsourceCityQuota;
import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceProject;
import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceTradeRecordItem;

import java.math.BigDecimal;

public interface CrowdsourceProjectService {

	CrowdsourceProjectDetailDto refreshProjectDetail(CrowdsourceProject project);

	/**
	 * 支付智众包项目
	 */
	SmartResult payCrowdsourceProject(CrowdsourceProject project, String companyInvoiceRemark);

	/**
	 * 智众包重新支付单条明细
	 */
	SmartResult repayCrowdsourceProjectItem(int itemid);

	/**
	 * 智众包项目批量代付结果查询处理
	 */
	void handleCrowdsourceProjectTradeQueryResult(BatchQueryResultDto queryResultDto);
	/**
	 * 智众包项目平安支付批量代付结果查询处理
	 */
	void handleCrowdsourceProjectTradeQueryResultForPingan(BatchTransferQuery batchTransferQuery ,String batchNo);

	/**
	 * 智众包项目的单条明细重新支付的查询结果处理
	 */
	void handleCrowdsourceProjectItemRepayTradeState(CrowdsourceTradeRecordItem trade, String orderState, String errorcode,
	                                                 String errormsg);

	/**
	 * 查询第三方支付结果的众包项目
	 */
	void queryCrowdsourceProjectTradeItemPayState(int batchId);

	/**
	 * 匹配众包撮合项目
	 */
	void matchCrowdsourceProject();

	/**
	 * 计算单笔项目的综合税费和服务费，合伙人佣金
	 *
	 * @param project
	 * @param item
	 * @param company
	 * @param calcAmountType 计算的项目金额类型, 取值于 {@link com.info.zhiduoduo.common.constants.project.CalcAmountType}
	 * @return
	 */
	CrowdsourceItemAmountCalcResult calcItemAmount(CrowdsourceProject project, CrowdsourceProjectItemModel item, Company company, int calcAmountType);

	CrowdsourceItemAmountCalcResult calcItemAmount(CalcCrowdsourceItemAmountModel model);

	/**
	 * 计算单笔项目的综合税费和服务费，合伙人佣金（众包子项目含同一个人多笔任务的情况）
	 * @param currProjectAmount 多笔任务已计算的项目金额，不含当笔子项目
	 * @param currTaxFee	多笔任务已计算的项目税费金额
	 * @param model
	 * @return
	 */
	CrowdsourceItemAmountCalcResult calcItemAmountRepeat(BigDecimal currProjectAmount,
																BigDecimal currTaxFee,
																CalcCrowdsourceItemAmountModel model);
	CrowdsourceItemAmountCalcResult calcItemAmountRepeat(CrowdsourceProject project, CrowdsourceProjectItemModel item, Company company, int calcAmountType,BigDecimal currProjectAmount, BigDecimal currTaxFee);

	/**
	 * 处理众包项目单条明细的限额
	 *
	 * @param company
	 * @param itemAmountCalc
	 * @param personalQuota
	 * @param studioQuota
	 */
	void handleProjectItemCalcQuota(Company company, CrowdsourceItemAmountCalcResult itemAmountCalc, CrowdsourceCityQuota personalQuota,
	                                CrowdsourceCityQuota studioQuota);

	/**
	 * 获取企业众包项目的合伙人佣金比例
	 *
	 * @param compid
	 * @return
	 */
	double getPartnerBrokerageRate(int compid);

//	/**
//	 * 获取企业注册地的城市限额(自然人使用)
//	 *
//	 * @param compid
//	 * @return
//	 */
//	CrowdsourceCityQuota findCompanyCityQuota(int compid);

	/**
	 * 获取企业城市限额(自然人使用)
	 *
	 * @param cityId
	 * @return
	 */
	CrowdsourceCityQuota findPersonalCityQuota(int cityId);

	/**
	 * 获取创客注册地的城市限额
	 *
	 * @param userid
	 * @return
	 */
	CrowdsourceCityQuota findStudioCityQuota(int userid);

	/**
	 * 查询众包招商银行交易成功的交易后续是否存在退票，如果退票修改项目状态，发送通知
	 */
	void queryZhaoShangPayTradeIsFail();

	/**
	 * 刷新项目中企业的最新信息-企业各项税率/支付方式/支付主体等
	 * @param projectId
	 * @return
	 */
	CrowdsourceProject getAndRefreshProject(int projectId);
}
